package com.cn.mmd.controller;

import com.cn.mmd.mapper.QuestionnaireSubmitMapper;
import com.cn.mmd.model.*;

import com.cn.mmd.service.QuestionnaireService;
import com.cn.mmd.service.SCLService;
import com.cn.mmd.service.StudentService;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.text.DateFormat;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.*;


/**
 * SCL-90问卷控制类
 * Created by Administrator on 2016/8/31.
 */

@Controller
@RequestMapping(value ="QuestionnaireSCL")
public class QuestionnaireSCLController {

    @Autowired
    QuestionnaireService questionnaireService;
    @Autowired
    SCLService sclService;
    @Autowired
    StudentService studentService;
    @Autowired
    TokenController tokenController;

    /**
     * 答题SCL-90问卷
     * @param request
     * @return
     */
    @RequestMapping(value = "submitQuestionnaireSCL")
    public synchronized @ResponseBody
    Map<String,Object> submitQuestionnaireSCL(HttpServletRequest request)throws Exception {

        Map<String, Object> map = new HashMap<String, Object>();
        Map<String, Object> map1 = new HashMap<String, Object>();

        String questionnaireSubmits=request.getParameter("questionnaireSubmit");
        //questionnaireSubmit:{"questionnaireId":"问卷id","respondentId":"答题者id","answerResults":[{"questionNumber":"问题序号","stuOption":"选项"}
        // {"questionNumber":"问题序号","stuOption":"选项"}]}
        String studentId=request.getParameter("studentId");//答题者id
        String token=request.getParameter("token");

        StudentApp studentApp;
        studentApp = (StudentApp) tokenController.token1(studentId, token);
        if (studentApp==null){
            map.put("code", 203);
            map.put("message", "您暂无权限做此操作");
//            map.put("data", "");
            return map;
        }

        JSONObject jsonObject=JSONObject.fromObject(questionnaireSubmits);

        int questionnaireId=Integer.parseInt(jsonObject.getString("questionnaireId"));//问卷id
        String respondentId=jsonObject.getString("respondentId");//答题者id
        String answerResults =jsonObject.getString("answerResults");//答题的具体内容  是一个jsonArray
        Date now = new Date();
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//可以方便地修改日期格式
        String fillTime = dateFormat.format(now);//时间

        JSONArray jsonArray=JSONArray.fromObject(answerResults);
        List<Integer> total=new ArrayList<Integer>();//总分
//        List<Integer> positive=new ArrayList<Integer>();//阳性项目
//        List<Integer> negative=new ArrayList<Integer>();//阴性项目

//        List<Integer> somatization=new ArrayList<Integer>();//躯体化项
//        List<Integer> compulsion=new ArrayList<Integer>();//强迫症状
//        List<Integer> interpersonal =new ArrayList<Integer>();//人际关系
//        List<Integer> depressed=new ArrayList<Integer>();//抑郁
//        List<Integer> anxiety=new ArrayList<Integer>();//焦虑
//        List<Integer> enmity=new ArrayList<Integer>();//敌对
//        List<Integer> terror=new ArrayList<Integer>();//恐怖
//        List<Integer> stubborn=new ArrayList<Integer>();//偏执
//        List<Integer> psychoticism=new ArrayList<Integer>();//精神病性
//        List<Integer> other=new ArrayList<Integer>();//其他

        String questionOption="";//问题-选项  格式：序号1_选项!序号2_选项。。
        for (int i=0;i<jsonArray.size();i++) {

            JSONObject jsonarray = jsonArray.getJSONObject(i);

            //int questionId = Integer.parseInt(jsonarray.getString("questionId"));//问题id
            int questionNumber = Integer.parseInt(jsonarray.getString("questionNumber"));//问题序号
            int stuOption = Integer.parseInt(jsonarray.getString("stuOption"));//答题者所选的选项，格式为："stuOption":4

            total.add(stuOption);//所有答题的选项
//            if(stuOption>=2){
//                positive.add(stuOption);//大于2就添加到阳性中
//            }else {
//                negative.add(stuOption);//阴性
//            }

            QuestionnaireResult questionnaireResult1=new QuestionnaireResult();
            questionnaireResult1.setQuestionnaireid(questionnaireId);
            questionnaireResult1.setQuestionnumber(questionNumber);

            QuestionnaireResult questionnaireResult=questionnaireService.selectByQuestionNum(questionnaireResult1);//通过问题id查出该问题信息
            if (questionnaireResult!=null){
               // int questionNumber=questionnaireResult.getQuestionnumber();//序号
//                if (questionNumber==1||questionNumber==4||questionNumber==12||questionNumber==27||questionNumber==40||questionNumber==42
//                        ||questionNumber==48||questionNumber==49||questionNumber==52||questionNumber==53||questionNumber==56||questionNumber==58){
//                    //int[] somatization1={1,4,12,27,40,42,48,49,52,53,56,58};//躯体化项对应序号数组
//                    somatization.add(stuOption);
//                }else if (questionNumber==3||questionNumber==9||questionNumber==10||questionNumber==28||questionNumber==38||questionNumber==45
//                        ||questionNumber==46||questionNumber==51||questionNumber==55||questionNumber==65){
//                    //int[] compulsion1={3,9,10,28,38,45,46,51,55,65};//强迫症状对应序号数组
//                    compulsion.add(stuOption);
//                }else if (questionNumber==6||questionNumber==21||questionNumber==34||questionNumber==36||questionNumber==37||questionNumber==41
//                        ||questionNumber==61||questionNumber==69||questionNumber==73){
//                    //int[] interpersonal1={6,21,34,36,37,41,61,69,73};//人际关系对应序号数组
//                    interpersonal.add(stuOption);
//                }else if (questionNumber==5||questionNumber==14||questionNumber==15||questionNumber==20||questionNumber==22||questionNumber==26
//                        ||questionNumber==29||questionNumber==30||questionNumber==31||questionNumber==32||questionNumber==54||questionNumber==71||questionNumber==79){
//                    //int[] depressed1={5,14,15,20,22,26,29,30,31,32,54,71,79};//抑郁对应序号数组
//                    depressed.add(stuOption);
//                }else if (questionNumber==2||questionNumber==17||questionNumber==23||questionNumber==33||questionNumber==39||questionNumber==57
//                        ||questionNumber==72||questionNumber==78||questionNumber==80||questionNumber==86) {
//                    //int[] anxiety1={2,17,23,33,39,57,72,78,80,86};//焦虑对应序号数组
//                    anxiety.add(stuOption);
//                }else if (questionNumber==11||questionNumber==24||questionNumber==63||questionNumber==67||questionNumber==74||questionNumber==81){
//                   // int[] enmity1={11,24,63,67,74,81};//敌对对应序号数组
//                    enmity.add(stuOption);
//                }else if (questionNumber==13||questionNumber==25||questionNumber==47||questionNumber==50||questionNumber==70||questionNumber==75
//                        ||questionNumber==82){
//                    //int[] terror1={13,25,47,50,70,75,82};//恐怖对应序号数组
//                    terror.add(stuOption);
//                }else if (questionNumber==8||questionNumber==18||questionNumber==43||questionNumber==68||questionNumber==76||questionNumber==83){
//                    //int[] stubborn1={8,18,43,68,76,83};//偏执对应序号数组
//                    stubborn.add(stuOption);
//                }else if (questionNumber==7||questionNumber==16||questionNumber==35||questionNumber==62||questionNumber==77||questionNumber==84
//                        ||questionNumber==85||questionNumber==87||questionNumber==88||questionNumber==90){
//                    //int[] psychoticism1={7,16,35,62,77,84,85,87,88,90};//精神病性对应序号数组
//                    psychoticism.add(stuOption);
//                }else if (questionNumber==19||questionNumber==44||questionNumber==59||questionNumber==60||questionNumber==64||questionNumber==66
//                        ||questionNumber==89){
//                    //int[] other1={19,44,59,60,64,66,89};//其他对应序号数组
//                    other.add(stuOption);
//                }else {
//                    map.put("code",201);
//                    map.put("message","传入问题序号有误");
//                    map.put("data","");
//                    return map;
//                }

                if (questionOption==""){
                    questionOption=questionNumber+"_"+stuOption;
                }else {
                    questionOption=questionOption+"!"+questionNumber+"_"+stuOption;
                }

            }else {
                //没查到这道题
                map.put("code",201);
                map.put("message","问题获取失败");
//                map.put("data","");
                return map;
            }
        }

        int totalSum=0;//总得分
        for (int i:total) {
            totalSum += i;
        }

//        int positiveSum=0;//阳性症状项目总分
//        for (int i:positive){
//            positiveSum+=i;
//        }
//        float positiveAvg=(Math.round(positiveSum/positive.size() * 100)) / 100;//阳性症状项目均分
//
//        int negativeSum=0;//阴性症状项目总分
//        for (int i:negative){
//            negativeSum+=i;
//        }
//
//
//        int somatizationSum=0;//躯体化总分
//        for (int i:somatization){
//            somatizationSum+=i;
//        }
//        float somatizationAvg=(Math.round(somatizationSum/somatization.size() * 100)) / 100;//躯体化总均分
//
//        int compulsionSum=0;//强迫症状总分
//        for (int i:compulsion){
//            compulsionSum+=i;
//        }
//        float compulsionAvg=(Math.round(compulsionSum/compulsion.size() * 100)) / 100;//强迫症总均分
//
//        int interpersonalSum=0;//人际关系总分
//        for (int i:interpersonal){
//            interpersonalSum+=i;
//        }
//        float interpersonalAvg=(Math.round(interpersonalSum/interpersonal.size() * 100)) / 100;//人际关系总均分
//
//        int depressedSum=0;//抑郁总分
//        for (int i:depressed){
//            depressedSum+=i;
//        }
//        float depressedAvg=(Math.round(depressedSum/depressed.size() * 100)) / 100;//抑郁总均分
//
//        int anxietySum=0;//焦虑总分
//        for (int i:anxiety){
//            anxietySum+=i;
//        }
//        float anxietyAvg=(Math.round(anxietySum/anxiety.size() * 100)) / 100;//焦虑总均分
//
//        int enmitySum=0;//敌对总分
//        for (int i:enmity){
//            enmitySum+=i;
//        }
//        float enmityAvg=(Math.round(enmitySum/enmity.size() * 100)) / 100;//敌对总均分
//
//        int terrorSum=0;//恐怖总分
//        for (int i:terror){
//            terrorSum+=i;
//        }
//        float terrorAvg=(Math.round(terrorSum/terror.size() * 100)) / 100;//恐怖总均分
//
//        int stubbornSum=0;//偏执总分
//        for (int i:stubborn){
//            stubbornSum+=i;
//        }
//        float stubbornAvg=(Math.round(stubbornSum/stubborn.size() * 100)) / 100;//偏执总均分
//
//        int psychoticismSum=0;//精神病性总分
//        for (int i:psychoticism){
//            psychoticismSum+=i;
//        }
//        float psychoticismAvg=(Math.round(psychoticismSum/psychoticism.size() * 100)) / 100;//精神病性总均分
//
//        int otherSum=0;//其他总分
//        for (int i:other){
//            otherSum+=i;
//        }
//        float otherAvg=(Math.round(otherSum/other.size() * 100)) / 100;//其他总均分

        Questionnairesclsubmit questionnairesclsubmit=new Questionnairesclsubmit(questionnaireId,respondentId,questionOption,fillTime,totalSum);

//        QuestionnaireStatistical questionnaireStatistical1=questionnaireService.selectStatistical(questionnaireId);
//        if (questionnaireStatistical1.getDetailedstatistical()!=null){
//            String[] statisticals=questionnaireStatistical1.getDetailedstatistical().split("!!");
//        }
//
//        QuestionnaireStatistical questionnaireStatistical=new QuestionnaireStatistical();
//        questionnaireStatistical.setQuestionnaireid(questionnaireId);
//        questionnaireStatistical.setNotchoosenumber(questionnaireStatistical1.getNotchoosenumber()-1);
//        questionnaireStatistical.setChoosenumber(questionnaireStatistical1.getChoosenumber()+1);
//        questionnaireStatistical.setDetailedstatistical();

        int a=sclService.submitQuestionnaireSCL(questionnairesclsubmit);
        if (a>0){
            //添加成功

            QuestionnaireStudent questionnaireStudent=new QuestionnaireStudent();

            questionnaireStudent.setStudentid(respondentId);
            questionnaireStudent.setQuestionnaireid(questionnaireId);
            questionnaireStudent.setState("YES");

            int x=studentService.updateState(questionnaireStudent);
            if (x>0){
                //状态修改成功
            }else {
                map.put("code",205);
                map.put("message","修改学生问卷关联状态失败");
//                map.put("data","");
                return map;
            }

            if (totalSum>=168.72 ){
                map.put("data","亲，记得给心灵放个假~");
            }else {
                map.put("data","亲，你的状态很好哟~");
            }
            map.put("code",200);
            map.put("message","填写问卷成功");

        }else {
            map.put("code",202);
            map.put("message","填写问卷失败");
//            map.put("data","");
        }
        return map;
        }


    /**
     * 导出SCL-90详情表至Excel表格
     */
    @RequestMapping(value = "GetOutSCL")
    public synchronized @ResponseBody Map<String,Object>  GetOutSCL(HttpServletRequest request,HttpServletResponse response) throws Exception {

        Map<String, Object> map = new HashMap<String, Object>();
        Map<String, Object> map1 = new HashMap<String, Object>();
        String questionnaireExplain = request.getParameter("questionnaireExplain");//选择要导出的问卷类型
        String startTime = request.getParameter("startTime");//开始时间   传入的时间格式应为：yyyy-MM-dd 只到天
        String endTime = request.getParameter("endTime");//结束时间

//        System.out.println("时间："+startTime);

        DateFormat df1 = new SimpleDateFormat("MM/dd/yyyy");
        Date date1 = df1.parse(startTime);
        df1 = new SimpleDateFormat("yyyy-MM-dd");
        String s1 = df1.format(date1);
        DateFormat df2 = new SimpleDateFormat("MM/dd/yyyy");
        Date date2 = df2.parse(endTime);
        df2 = new SimpleDateFormat("yyyy-MM-dd");
        String s2 = df2.format(date2);

//        System.out.println(s1+"------"+s2);
        map1.put("startTime", s1);
        map1.put("endTime", s2);

        if (questionnaireExplain.equals("SCL-90")) {
            String[] title = new String[91];

            // 第一步，创建一个webbook，对应一个Excel文件
            HSSFWorkbook wb = new HSSFWorkbook();

            request.setCharacterEncoding("UTF-8");
            response.setCharacterEncoding("UTF-8");
            response.setContentType("application/x-download");

            String filedisplay = "SCL-90测评" + s1 + "-" + s2 + ".xls";
            filedisplay = URLEncoder.encode(filedisplay, "UTF-8");
            response.addHeader("Content-Disposition", "attachment;filename=" + filedisplay);

            // 第二步，在webbook中添加一个sheet,对应Excel文件中的sheet
            HSSFSheet sheet = wb.createSheet("SCL-90测评");
            // 第三步，在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short
            HSSFRow row = sheet.createRow((int) 0);
            // 第四步，创建单元格，并设置值表头 设置表头居中
            HSSFCellStyle style = wb.createCellStyle();
            style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建一个居中格式

            HSSFCell cell = row.createCell((short) 0);
            cell.setCellValue("答题者学号");
            cell.setCellStyle(style);
            for (int i = 1; i < title.length; i++) {
                cell = row.createCell((short) i);
                cell.setCellValue("第" + i + "题");
                cell.setCellStyle(style);
            }

            // 第五步，写入实体数据 实际应用中这些数据从数据库得到，

            List<Questionnairesclsubmit> list = sclService.selectSCLSubmit(map1);//查出要导出的表
//          System.out.println("查到啦？？"+list.size());

            if (list.size() <= 0) {
                //没查到数据
                map.put("code", 201);
                map.put("message", "查询没有值");
//            map.put("data","");
                return map;
            } else {
                for (int i = 0; i < list.size(); i++) {
                    //  System.out.println(list.get(i).getFilltime());

                    String respondentId = list.get(i).getRespondentid();//答题者id
                    String questionOption = list.get(i).getQuestionoption();//题-选项
                    List<Integer> list1 = new ArrayList<Integer>();
                    String[] questionOptions = questionOption.split("!");
                    //System.out.println(questionOptions.length);
                    for (int a = 0; a < questionOptions.length; a++) {

                        String[] options = questionOptions[a].split("_");
                        // System.out.println("options的长度："+options.length);
                        //     System.out.print(options[1]+"--");
                        int option = Integer.parseInt(options[1]);
                        list1.add(option);
                    }

                    row = sheet.createRow((int) i + 1);
                    // 第四步，创建单元格，并设置值
                    row.createCell((short) 0).setCellValue((String) respondentId);
                    //  System.out.println("list1的长度："+list1.size());
                    for (int c = 0; c < list1.size(); c++) {
                        //System.out.println(list1.get(c).toString());
                        row.createCell((short) c + 1).setCellValue((Integer) list1.get(c));
                    }
                }

            }

            // 第六步，将文件存到指定位置
            try {
                OutputStream out = response.getOutputStream();
                //FileOutputStream fout = new FileOutputStream("D:/SCL-90测评.xls");
                wb.write(out);
                out.close();
                map.put("code", 200);
                map.put("message", "导出成功");
//            map.put("data","");
            } catch (Exception e) {
                map.put("code", 202);
                map.put("message", "出现异常");
//            map.put("data","");
                e.printStackTrace();
            }

        }else if (questionnaireExplain.equals("入学适应性")){

            int[] title=new int[51];

            // 第一步，创建一个webbook，对应一个Excel文件
            HSSFWorkbook wb = new HSSFWorkbook();

            request.setCharacterEncoding("UTF-8");
            response.setCharacterEncoding("UTF-8");
            response.setContentType("application/x-download");

            String filedisplay = "入学适应性"+s1+"-"+s2+".xls";
//          String filedisplay = "标签化教评数据.xls";
            filedisplay = URLEncoder.encode(filedisplay, "UTF-8");
            response.addHeader("Content-Disposition", "attachment;filename="+ filedisplay);

            // 第二步，在webbook中添加一个sheet,对应Excel文件中的sheet
            HSSFSheet sheet = wb.createSheet("入学适应性");
            // 第三步，在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short
            HSSFRow row = sheet.createRow((int) 0);
            // 第四步，创建单元格，并设置值表头 设置表头居中
            HSSFCellStyle style = wb.createCellStyle();        style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建一个居中格式

            HSSFCell cell = row.createCell((short) 0);
            cell.setCellValue("学校");
            cell=row.createCell((short) 1);
            cell.setCellValue("学院");
            cell=row.createCell((short) 2);
            cell.setCellValue("专业");
            cell=row.createCell((short) 3);
            cell.setCellValue("届数");
            cell=row.createCell((short) 4);
            cell.setCellValue("姓名");
            cell=row.createCell((short) 5);
            cell.setCellValue("学号");
            cell=row.createCell((short) 6);
            cell.setCellValue("周数");

            cell.setCellStyle(style);

            for (int i=1;i<title.length;i++){
                cell = row.createCell((short) 2*i+5);
                cell.setCellValue("题目"+i);
                cell = row.createCell((short) 2*i+6);
                cell.setCellValue("题目"+i+"选择内容");
                cell.setCellStyle(style);
            }


            // 第五步，写入实体数据 实际应用中这些数据从数据库得到，
            Questionnaire questionnaire=new Questionnaire();
            questionnaire.setQuestionnaireexplain(questionnaireExplain);

            List<Questionnaire> questionnaireList=questionnaireService.selectAllQuestionnaire(questionnaire);
            int questionnaireId=questionnaireList.get(0).getQuestionnaireid();
            List<QuestionnaireResult> questionnaireResultList=questionnaireService.selectQuestionnaireResult(questionnaireId);//查出题目

            List<QuestionnaireSubmit> list=questionnaireService.selectQuestionnaireSubmitByTimeQuantum(map1);//查出要导出的表

            Map<String,Object> map2=null;
            List<Map> list1=null;

            for (int i=0;i<list.size();i++){
                //  System.out.println(list.get(i).getFilltime());

                String schoolName=list.get(i).getStudentschool();//学校
                String colleagueName=list.get(i).getStudentcollege();//学院
                String studentMajor=list.get(i).getStudentmajor();//专业
                String studentGrade=list.get(i).getStudentgrade();//届数
                String studentname=list.get(i).getStudentname();//姓名
                String studentId=list.get(i).getRespondentid();//学号
                int weekNum=list.get(i).getWeeknum();//评价时间周数

                String stuOption=list.get(i).getStuoption();//学生选择的标签


                list1=new ArrayList<Map>();

                String[] stuOptions=stuOption.split("!!");
                //System.out.println(questionOptions.length);
//              System.out.println("分割后的长度："+evaluateLabels.length);
                for (int a=0;a<stuOptions.length;a++){
                    map2=new HashMap<String,Object>();
                    String[] stuOptions1=stuOptions[a].split("!");

                    int titleNumber=Integer.parseInt(stuOptions1[0]);//题目序号
                    int optionNumber=Integer.parseInt(stuOptions1[1]);//选项序号

                    String optionContent="";//选项内容
                    for (QuestionnaireResult questionnaireResult:questionnaireResultList){
                        if (titleNumber==questionnaireResult.getQuestionnumber()){
                            String [] options=questionnaireResult.getOptions().split("!!");
                            String [] optionContents=questionnaireResult.getOptionsdescribe().split("!!");
                            for (int b=0;b<options.length;b++){
                                System.out.println(options[b]+"====="+optionContents[b]);
                                if (Integer.parseInt(options[b])==optionNumber){
                                    optionContent=optionContents[b];
                                }
                            }
                        }
                    }

                    System.out.println(optionNumber+"====="+optionContent);
                    map2.put("titleNumber",titleNumber);//题序号
                    map2.put("optionNumber",optionNumber);//选项序号
                    map2.put("optionContent",optionContent);//选项内容

                    list1.add(map2);
                }

                row = sheet.createRow((int) i + 1);
                // 第四步，创建单元格，并设置值
                row.createCell((short) 0).setCellValue(schoolName);
                row.createCell((short) 1).setCellValue(colleagueName);
                row.createCell((short) 2).setCellValue(studentMajor);
                row.createCell((short) 3).setCellValue(studentGrade);
                row.createCell((short) 4).setCellValue(studentname);
                row.createCell((short) 5).setCellValue(studentId);
                row.createCell((short) 6).setCellValue(weekNum);
                //  System.out.println("list1的长度："+list1.size());
//            for (int c=0;c<list1.size();c++){
//                row.createCell((short) c+1).setCellValue((Integer) list1.get(c));
//            }
//            System.out.println("list1的长度："+list1.size());
                for (Map m:list1){
                    int num=(Integer)m.get("titleNumber");

//                System.out.println(m.get("labelGrade")+"========"+m.get("label"));
                    row.createCell((short) 2*num+5).setCellValue((Integer)m.get("optionNumber"));
                    row.createCell((short) 2*num+6).setCellValue((String)m.get("optionContent"));
                }
            }


            // 第六步，将文件存到指定位置
            try
            {
                OutputStream out = response.getOutputStream();
                //FileOutputStream fout = new FileOutputStream("D:/SCL-90测评.xls");
                wb.write(out);
                out.close();
                map.put("code",200);
                map.put("message","导出成功");
//            map.put("data","");
            }
            catch (Exception e)
            {
                map.put("code",202);
                map.put("message","出现异常");
//            map.put("data","");
                e.printStackTrace();
            }

        }else {
            //可添加问卷类型
        }
            return map;

    }


}






